"use strict"
//在一个对象中绑定函数，称为这个对象的方法
function method() {
    // var Person={
    //     name:'张无忌',
    //     birth:1995,
    //     age:function () {
    //         var y=new Date().getFullYear();
    //         return y-this.birth;//this是一个特殊对象，它始终指向当前对象
    //     }
    // };
    // Person.age;//function Person age()
    // console.log(Person.age());


    var Person1={
        name:'赵敏',
        birth:1998,
        age:getAge
    }
    function getAge() {
        var a=new Date().getFullYear();
        return a-this.birth;
    }
    console.log(Person1.age());
    //console.log(getAge());
    //getAge();//NaN
    //JavaScript的函数内部如果调用了this，那么这个this到底指向谁
    //如果以对象方式的形式调用，如Person.age（），该函数的this指向被调用的对象，也就是Person。
    // 如果单独调用函数，如getAge(),此时，该函数的this指向全局对象，也就是windows
}

//用that变量首先捕获this
function method2() {
    var Person2={
        name:'段誉',
        birth:1992,
        age:function () {
            var that=this;//在方法内部一开始就捕获this
            function getAgeFromBirth() {//方法重构
                var y=new Date().getFullYear();
                return y-that.birth;//用that而不是this
            }
            return getAgeFromBirth();
        }
    };
    console.log(Person2.age());

}

//要指定函数的this指向那个对象，可以用函数本身的apply方法，它接收两个参数，
// 第一个参数就是需要绑定的this变量，第二个参数是array，表示函数本身的参数。
function method3() {
    function getAge () {
            var y=new Date().getFullYear();
            return y-this.birth;
    }
        var person3={
            name:'周芷若',
            birth:1993,
            age:getAge
        };
    console.log(person3.age());//25
    console.log(getAge.apply(person3,[]));//25 this指向person3 参数为空

    //apply()与call()类似，区别是：
    //1、apply()把参数打包成array再传入
    //2、call()把参数按顺序传入
    Math.max(3,4,5);
    console.log(Math.max.apply(null,[3,4,5]));
    console.log(Math.max.call(null,3,4,5));
}

//装饰器
/*
* 利用apply()，可以动态改变函数的行为
* JavaScript的所有对象都是动态的，即使内置函数，我们也可以重新指向新的函数
*
* */
function decorator() {
    var count=0;
    var oldParseInt=parseInt;//保存原函数

    window.parseInt=function () {
        count+=1;
        return oldParseInt.apply(null,arguments);//调用原函数
    } ;

    console.log(parseInt('10'));
    console.log(parseInt('20'));
    console.log(parseInt('30'));
    console.log('count='+count);
}